package treegenerator;

import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

public class MainTreeGenerator {

    private static Nodo nodoRaiz = new Nodo();
    static ArrayList<Rama> ramaList = new ArrayList<Rama>();
    static GenericTree<String> tree = new GenericTree<String>();

    public static void main(String[] args) {
        GenericTreeNode<String> root = new GenericTreeNode<String>(nodoRaiz.getNombre());

        crearRamas(root);

        Iterator<Rama> itrRama = ramaList.iterator();

        agregarHijos(itrRama, root);
        recorrerHijos(itrRama, root);

        //System.out.print(tree.toString());
        espacios = 0;
        Utilidades.mostrarEspacios(espacios);
        System.out.print(root.getData() + "");
        System.out.println(tree.getRoot().toStringVerbose());
        imprimirHijos(root);

        SchemaEditor.imprimirHijos(root);
    }

    static void agregarHijos(Iterator<Rama> itr, GenericTreeNode<String> n) {
        while (itr.hasNext()) {
            Rama element = itr.next();
            if (!buscarNodo(n, element.hijo.getNombre())) {
                if (element.padre.getNombre().equals(n.getData())) {
                    n.addChild(new GenericTreeNode<String>(element.hijo.getNombre()));
                }
            }
        }
    }

    static boolean buscarNodo(GenericTreeNode<String> n, String data) {
        if (n.getParent() == null) {
            if (n.getData().equals(data)) {
                return true;
            } else {
                return false;
            }
        } else {
            if (n.getParent().getData().equals(data)) {
                return true;
            } else {
                return buscarNodo(n.getParent(), data);
            }
        }
    }

    static void recorrerHijos(Iterator<Rama> itr, GenericTreeNode<String> n) {
        for (int i = 0; i < n.getNumberOfChildren(); i++) {
            itr = ramaList.iterator();
            agregarHijos(itr, n.getChildAt(i));
            recorrerHijos(itr, n.getChildAt(i));
            n.withNode = n.withNode + n.getChildAt(i).withNode;//atenti
        }
    }
    static ArrayList<String> nivel = new ArrayList<String>();
    static int espacios;

    static void imprimirHijos(GenericTreeNode<String> n) {
        for (int i = 0; i < n.getNumberOfChildren(); i++) {
            if (n.getChildAt(i).getNumberOfChildren() != 0) {
                //System.out.print(n.toString());

                //nivel.add(n.getChildAt(i).toStringVerbose());
                //nivel.get(i).add(n.getChildAt(i).toStringVerbose());
                espacios += 2;
                Utilidades.mostrarEspacios(espacios);
//                n.espaciosImprimir=espacios;//atencion aqui
                System.out.print("el " + i + " de " + n.getData() + ": ");
//                System.out.print(i);
                System.out.print(n.getChildAt(i).getData() + "");
                System.out.println(n.getChildAt(i).toStringVerbose());
            }
            imprimirHijos(n.getChildAt(i));
            espacios--;
            //System.out.print("_");
        }
    }

    static void crearRamas(GenericTreeNode<String> root) {
        String lineaArchivo;
        BufferedReader lectorArchivo = Utilidades.leerArchivo("reglas.txt");

        String nombrePadre = " ";
        String nombreHijo = " ";
        int cant = 0;
        try {
            while (lectorArchivo.ready()) {
                lineaArchivo = lectorArchivo.readLine();
                StringTokenizer st = new StringTokenizer(lineaArchivo, "-");
                int idToken = 0;
                while (st.hasMoreTokens()) {
                    lineaArchivo = st.nextToken();
                    if (cant == 0) {
                        root.setData(lineaArchivo);
                        tree.setRoot(root);
                        nodoRaiz.setNombre(lineaArchivo);
                    } else {
                        if (idToken == 0) {
                            nombrePadre = lineaArchivo;
                        } else {
                            nombreHijo = lineaArchivo;
                        }
                    }
                    idToken++;
                }
                if (cant != 0) {
                    ramaList.add(new Rama(new Nodo(nombrePadre), new Nodo(nombreHijo)));
                }
                cant++;
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}
